home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue26 / clinic / CLIPEG2U.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1997-08-28  |  2.9 KB  |  121 lines

  1. unit ClipEg2U;
  2.  
  3. interface
  4.  
  5. uses
  6.   WinProcs, WinTypes, Messages, SysUtils, Classes, Graphics, Controls,
  7.   Forms, Dialogs, ExtCtrls, StdCtrls, Spin;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     btnCopy: TButton;
  12.     btnPaste: TButton;
  13.     SpinEdit1: TSpinEdit;
  14.     SpinEdit2: TSpinEdit;
  15.     Edit1: TEdit;
  16.     Memo1: TMemo;
  17.     procedure FormCreate(Sender: TObject);
  18.     procedure btnCopyClick(Sender: TObject);
  19.     procedure btnPasteClick(Sender: TObject);
  20.   private
  21.     { Private declarations }
  22.   public
  23.     { Public declarations }
  24.   end;
  25.  
  26.   TDataRecord = packed record
  27.     Number1, Number2: Longint;
  28.     AString: String[255];
  29.   end;
  30.  
  31. var
  32.   Form1: TForm1;
  33.   CF_CLINICRECORD: Word;
  34.  
  35. implementation
  36.  
  37. uses
  38.   Clipbrd;
  39.  
  40. {$R *.DFM}
  41.  
  42. procedure TForm1.FormCreate(Sender: TObject);
  43. begin
  44.   CF_CLINICRECORD := RegisterClipboardFormat('Clinic Data Record');
  45. end;
  46.  
  47. procedure TForm1.btnCopyClick(Sender: TObject);
  48. var
  49.   Data: THandle;
  50.   DataPtr: Pointer;
  51.   DataRec: TDataRecord;
  52. begin
  53.   { Open clipboard for several formats to be added }
  54.   Clipboard.Open;
  55.   try
  56.     { Allocate appropriate memory block }
  57.     Data := GlobalAlloc(GMEM_MOVEABLE, SizeOf(DataRec));
  58.     try
  59.       { Lock memory block }
  60.       DataPtr := GlobalLock(Data);
  61.       try
  62.         { Set the record up }
  63.         DataRec.Number1 := SpinEdit1.Value;
  64.         DataRec.Number2 := SpinEdit2.Value;
  65.         DataRec.AString := Edit1.Text;
  66.         { Copy record to locked memory block }
  67.         Move(DataRec, DataPtr^, SizeOf(DataRec));
  68.         { Copy block into clipboard }
  69.         Clipboard.SetAsHandle(CF_CLINICRECORD, Data);
  70.         { Add a nice textual version into clipboard }
  71.         Clipboard.AsText := Format(
  72.           'Number 1: %d'#13#10'Number 2: %d'#13#10'AString: %s',
  73.           [DataRec.Number1, DataRec.Number2, DataRec.AString])
  74.       finally
  75.         { Unlock memory block }
  76.         GlobalUnlock(Data)
  77.       end
  78.     except
  79.       { Normally don't free this memory - it }
  80.       { belongs to the clipboard. But if there's }
  81.       { an error, then do the rightful thing }
  82.       GlobalFree(Data);
  83.       raise
  84.     end
  85.   finally
  86.     { Close clipboard }
  87.     Clipboard.Close
  88.   end
  89. end;
  90.  
  91. procedure TForm1.btnPasteClick(Sender: TObject);
  92. var
  93.   Data: THandle;
  94.   DataPtr: Pointer;
  95.   DataRec: TDataRecord;
  96. begin
  97.   Clipboard.Open;
  98.   try
  99.     { Get memory block handle }
  100.     Data := Clipboard.GetAsHandle(CF_CLINICRECORD);
  101.     { Turn it into a pointer by locking it }
  102.     DataPtr := GlobalLock(Data);
  103.     try
  104.       { Get data record and update UI }
  105.       Move(DataPtr^, DataRec, SizeOf(DataRec));
  106.       SpinEdit1.Value := DataRec.Number1;
  107.       SpinEdit2.Value := DataRec.Number2;
  108.       Edit1.Text := DataRec.AString;
  109.       { Don't forget the textual version }
  110.       Memo1.Text := Clipboard.AsText;
  111.     finally
  112.       { Unlock memory block }
  113.       GlobalUnlock(Data)
  114.     end
  115.   finally
  116.     Clipboard.Close
  117.   end;
  118. end;
  119.  
  120. end.
  121.